今天练习和复习了下面四道程序：
1）随机生成100个随机数。
```
#include<iostream>
#include<cstdlib>
#include<ctime> 
#define random(x) rand()%(x) 
using namespace std;

int main(){
   srand((int)time(0));
   for (int i=0;i<100;i++){
       cout<<random(100)<<" ";
   }       
}

```

2)输入100个整数（上题的输出正好是这题的输入），用shell排序法输出正确的顺序。
```
#include<iostream>
#include<vector>
using namespace std;
void ShellSort(int a[],int n){
    for(int gap=n/2;gap>0;gap/=2){
        for(int i=gap;i<n;++i){
            int j=i;
            while(j-gap>=0 && a[j-gap]>a[j])
            {
                a[j-gap] = a[j-gap]+a[j];
                a[j]     = a[j-gap]-a[j];
                a[j-gap] = a[j-gap]-a[j];
                j=j-gap;
            }
        }
    }
    for(int i=0;i<n;++i)cout<<a[i]<<" ";
}
int main(){
	int a[100];
	for(int i=0;i<100;i++) cin>>a[i];
    ShellSort(a,100);
    return 0;
}
```

3)使用至少两种方法完成“八皇后问题”。今晚介绍了两种，方法一：简单直接8个for循环；方法二：递归求解。详见下面代码。
程序1：
```
#include<iostream>
using namespace std;
int total=0;
bool check(int a[]){
	for(int i=0;i<8;i++){
		for(int j=i+1;j<8;j++){
			if(a[i]==a[j]) return false;
			if(a[i]-a[j]==i-j||a[i]-a[j]==j-i) return false;
		}
	} 
	return true;
}
void print(int a[]){
	cout<<++total<<":";
	for(int i=0;i<8;i++) cout<<a[i]<<" ";
	cout<<endl;
}
int main(){
	int a[8]={0,0,0,0,0,0,0,0};
	for(int b0=0;b0<8;b0++){
		a[0]=b0;
		for(int b1=0;b1<8;b1++){
			a[1]=b1;	
			for(int b2=0;b2<8;b2++){
				a[2]=b2;
				for(int b3=0;b3<8;b3++){
					a[3]=b3;
					for(int b4=0;b4<8;b4++){
						a[4]=b4;
						for(int b5=0;b5<8;b5++){
							a[5]=b5;						
							for(int b6=0;b6<8;b6++){
								a[6]=b6;
								for(int b7=0;b7<8;b7++){
									a[7]=b7;
									if(check(a)) print(a); 
								}
							}
						}
					}																
				}
			}
		}
	}
	return 0;
}
```

程序2：
```
#include<iostream>  //八皇后问题递归方法
using namespace std;
int total = 0;
int a[8] = { -1,-1,-1,-1,-1,-1,-1,-1 };
bool check(int row, int col) {     // 在row行，col列可以放置皇后吗？
	for (int i = 0; i < row; i++)  // 判断同列、对角线是否有皇后冲突
		if (a[i] == col || row - i == col - a[i] || row - i == a[i] - col)
			return false;          // 返回0表示不能放，有冲突
	return true;
}
void find(int n) {
	if (n == 8) {                  // 递归函数的出口，从0到7行都已经放置完毕，
		total++;                    // 并且都是正确的，所以当n=8的时候，方案数加1
		cout<<endl<<total<<":";
		for (int i = 0; i < 8; i++)
			cout << a[i] << "  ";  // 输出结果
		return;
	}
	else {
		for (int i = 0; i < 8; i++)
			if (check(n, i)) {
				a[n] = i;          // 如果该行可以放的话，就放
				find(n + 1);      // 放好之后，放下一行
			}                      
	}
}
int main() {
	find(0); 
	return 0;
}
```